package com.base.string;

import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

/**
 * 187. 重复的DNA序列
 * 所有 DNA 都由一系列缩写为 'A'，'C'，'G' 和 'T' 的核苷酸组成，例如："ACGAATTCCG"。在研究 DNA 时，识别 DNA 中的重复序列有时会对研究非常有帮助。
 * <p>
 * 编写一个函数来找出所有目标子串，目标子串的长度为 10，且在 DNA 字符串 s 中出现次数超过一次
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/repeated-dna-sequences
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 * @author leon
 * @date 2021年10月08日 21:55
 */
public class FindRepeatedDnaSequences {
    public List<String> findRepeatedDnaSequences(String s) {
        if (s == null) {
            throw new NullPointerException("this is a null string");
        }
        if (s.length() <= 10) {
            return new LinkedList<>();
        }
        StringBuilder sb = new StringBuilder(s);
        Set<String> set = new HashSet<>();
        Set<String> ret = new HashSet<>();
        for (int i = 0; i+9 < s.length(); i ++) {
            String sub = sb.substring(i, i + 10);
            if (!set.contains(sub)) {
                set.add(sub);
            } else {
                ret.add(sub);
            }
        }
        return new LinkedList<>(ret);
    }
}
